package com.hmily.cloud.elasticsearch.service.goods.bean;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * <h1>Goods 实体业务对象。</h1><br/>
 *
 * <h1><br/><a href="https://u.geekbang.org/subject/arch3/100614201">Java 业务架构实战营：https://u.geekbang.org/subject/arch3/100614201</a></h1><br/><h1><a href="https://gitee.com/ylimhhmily/BizArchPracticeCamp">Java 业务架构实战营代码地址：https://gitee.com/ylimhhmily/BizArchPracticeCamp</a></h1><br/><h1><a href="https://u.geekbang.org/subject/java4th/1001148?source=app_share">高级 Java 工程体系课 2023 版：https://u.geekbang.org/subject/java4th/1001148?source=app_share</a></h1><br/><h1><a href="https://time.geekbang.org/column/intro/100312101?tab=catalog">Dubbo 源码剖析与实战：https://time.geekbang.org/column/intro/100312101?tab=catalog</a></h1>
 *
 * <pre>
 * ======================================================
 * Spring Data ES通过注解来声明字段的映射属性，有下面的三个注解：
 *
 * &#64;Document: 作用在类，标记实体类为文档对象，一般有四个属性
 *      - indexName：对应索引库名称
 *      - shards：分片数量，默认1
 *      - replicas：副本数量，默认1
 * &#64;Id: 作用在成员变量，标记一个字段作为id主键
 * &#64;Field: 作用在成员变量，标记为文档的字段，并指定字段映射属性：
 *      - type：字段类型，取值是枚举：FieldType
 *      - index：是否索引，布尔类型，默认是true
 *      - store：是否存储，布尔类型，默认是false
 *      - analyzer：分词器名称：ik_max_word
 * ======================================================
 *
 * </pre>
 *
 * @author hmilyylimh
 *         ^_^
 * @version 0.0.1
 *         ^_^
 * @date 2024/7/6
 *
 */
@Setter
@Getter
@ToString(callSuper = true)
//@Accessors(chain = true)   // 链式赋值(连续set方法)，该链式操作会影响属性拷贝操作
@AllArgsConstructor        // 全参构造
@NoArgsConstructor         // 无参构造
// 指定当前类对象对应哪个ES中的索引
// 注意：如果我们没有手动去创建ES索引的话，那ES就会根据实体类上的注解来自动映射字段并且按照注解中的规则来定义字段的类型
@Document(indexName = "test_goods")
public class GoodsDTO implements Serializable {

    /**
     * 商品编号
     */
    @Id
    @Field(type = FieldType.Long)
    private Long id;

    /**
     * 商品标题
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String title;

    /**
     * 商品价格
     */
    @Field(type = FieldType.Double)
    private BigDecimal price;

    /**
     * 商品库存
     */
    @Field(type = FieldType.Integer)
    private Integer stock;

    /**
     * 商品销售数量
     */
    @Field(type = FieldType.Integer)
    private Integer saleNum;

    /**
     * 商品分类
     */
    @Field(type = FieldType.Keyword)
    private String categoryName;

    /**
     * 商品品牌
     */
    @Field(type = FieldType.Keyword)
    private String brandName;

    /**
     * 上下架状态
     */
    @Field(type = FieldType.Integer)
    private Integer status;

    /**
     * 商品创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    //@Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    private String createTime;
}
